package cn.icatw.leetcode.editor.cn;
//给定一个整数数组
// prices，其中第 prices[i] 表示第 i 天的股票价格 。
//
// 设计一个算法计算出最大利润。在满足以下约束条件下，你可以尽可能地完成更多的交易（多次买卖一支股票）:
//
//
// 卖出股票后，你无法在第二天买入股票 (即冷冻期为 1 天)。
//
//
// 注意：你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。
//
//
//
// 示例 1:
//
//
//输入: prices = [1,2,3,0,2]
//输出: 3
//解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
//
// 示例 2:
//
//
//输入: prices = [1]
//输出: 0
//
//
//
//
// 提示：
//
//
// 1 <= prices.length <= 5000
// 0 <= prices[i] <= 1000
//
//
// Related Topics 数组 动态规划 👍 1764 👎 0


//Java：买卖股票的最佳时机含冷冻期
public class T309_BestTimeToBuyAndSellStockWithCooldown{
    public static void main(String[] args) {
        Solution solution = new T309_BestTimeToBuyAndSellStockWithCooldown().new Solution();
        // TO TEST
    }
    //leetcode submit region begin(Prohibit modification and deletion)
    public class Solution {
        public int maxProfit(int[] prices) {
            if (prices == null || prices.length == 0) return 0;

            int hold = -prices[0];     // 第0天买入的持有状态
            int freeze = 0;            // 第0天卖出后的冷冻状态
            int unfreeze = 0;          // 第0天不持有股票且不在冷冻期的状态

            // 从第1天开始计算
            for (int i = 1; i < prices.length; i++) {
                int prevHold = hold;   // 保存前一天的持有状态
                hold = Math.max(hold, unfreeze - prices[i]);  // 买入或保持持有
                unfreeze = Math.max(unfreeze, freeze);        // 今天不操作
                freeze = prevHold + prices[i];                // 今天卖出，进入冷冻期
            }

            // 最终最大利润在不持有股票的状态下
            return Math.max(freeze, unfreeze);
        }
    }

//leetcode submit region end(Prohibit modification and deletion)

}
